![AWS Glue Custom Visual Transformsで独自の変換処理を作ってみた](https://devio2023-media.developers.io/wp-content/uploads/2022/08/aws-glue.png)
AWS Glue Custom Visual Transformsで独自の変換処理を作ってみた
データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
先月2022年12月に開催されたre:Invent期間中にAWS Glue Custom Visual Transformsのアップデートがアナウンスされました。
本エントリでは実際にAWS Glue Custom Visual Transformsを使ってみた様子をお届けします。
AWS Glue Custom Visual Transformsとは
うれしいところ
AWS Glue Custom Visual TransformsはGlue Studioのビジュアルエディタで独自の変換を定義でき、他のジョブにも再利用可能な機能です。
コードが書けるメンバーが独自のETLロジックをPythonとJSONで定義し、Custom Visual TransformとしてファイルをS3バケットに置いておくことで、同一AWSアカウント内の別のGlueジョブで再利用可能になります。標準で提供されている変換ノードと同じように使えて、ローコードのETL開発を便利にしてくれる機能です。
必要なもの
Custom Visual Transformsの定義で必要になるのは以下の通り。
- JSON設定ファイル(
.json
) - Pythonファイル(
.py
)- JSONファイルと同一の名前を指定
JSONで定義する
まずはCustom Visual Transformsのパラメータ情報や名前などを定義するJSON設定ファイルを作成します。以下のポストで記述されているサンプルを使ってJSONファイルを作成しました。(一部を日本語に変えています)
{ "name": "salesdata_generator", "displayName": "Synthetic Sales Data Generator", "description": "Generate synthetic order datasets for testing purposes.", "functionName": "salesdata_generator", "parameters": [ { "name": "numSamples", "displayName": "サンプル数", "type": "int", "description": "生成するサンプル数" }, { "name": "year", "displayName": "Year", "isOptional": true, "type": "int", "description": "ランダムに分布するデータを生成する年(デフォルトは昨年)", "validationRule": "^\\d{4}$", "validationMessage": "Please enter a valid year number" } ] }
定義が必要となるフィールドは以下の通り。
フィールド
項目 | 説明 |
---|---|
name |
Transformの名前。変換処理を定義するPythonファイルと同一名称とする必要がある。文字、アンダースコア、数字が使用可能。(先頭は文字かアンダースコアのみ) |
displayName (任意) |
ビジュアルジョブエディタに表示されるTransform名。指定しない場合、上述のname が表示される。 |
description (任意) |
Glue Studioに表示されるTransformの説明。この説明文で検索が可能。 |
functionName |
Pythonで呼び出す関数を特定するためのPython関数名 |
path (任意) |
PythonファイルへのS3フルパス。指定しない場合、同じS3ファイル上でJSON設定ファイルと同じ名前の.py ファイルを利用する。 |
parameters (任意) |
ビジュアルエディタで利用者が指定可能なパラメータ。パラメータで設定が必要な項目は後述。 |
パラメータ
項目 | 説明 |
---|---|
name |
Pythonに渡されるパラメータ名 |
displayName (任意) |
ビジュアルジョブエディタに表示される名前 |
type |
パラメータのデータ型。str 、int 、float 、list 、bool から指定。 |
isOptional |
パラメータが任意入力かどうかを指定。指定がない場合、必須入力として扱われる。 |
description (任意) |
ビジュアルエディタに表示されるパラメータの説明文 |
validationType (任意) |
パラメータの検証方法。現在はRegularExpression (正規表現)のみサポート。 |
validationRule (任意) |
validationType がRegularExpression の場合、正規表現を記載。構文はEcmascriptに準拠する必要がある。- ECMAScript® 2023 Language Specification |
validationMessage (任意) |
検証が失敗した時に表示するメッセージ |
listOptions |
Select または Multiselect UI コントロールに表示するオプション。 |
listType (任意) |
type = list のオプションの種類をstr 、int 、float 、list 、bool から定義 |
Pythonで変換処理を記述する
次に、具体的な変換処理をPythonで記述します。今回は上述したJSONファイルと同様のポストで記載されているPythonをサンプルとして使います。
from awsglue import DynamicFrame import pyspark.sql.functions as F import datetime import time def salesdata_generator(self, numSamples, year=None): if not year: \# Use last year year = datetime.datetime.now().year - 1 year_start_ts = int(time.mktime((year,1,1,0,0,0,0,0,0))) year_end_ts = int(time.mktime((year + 1,1,1,0,0,0,0,0,0))) ts_range = year_end_ts - year_start_ts departments = ["bargain", "checkout", "food hall", "sports", "menswear", "womenwear", "health and beauty", "home"] dep_array = F.array(*[F.lit(x) for x in departments]) dep_randomizer = (F.round(F.rand() * (len(departments) -1))).cast("int") df = self.glue_ctx.sparkSession.range(numSamples) \ .withColumn("sale_date", F.from_unixtime(F.lit(year_start_ts) + F.rand() * ts_range)) \ .withColumn("amount_dollars", F.round(F.rand() * 1000, 2)) \ .withColumn("department", dep_array.getItem(dep_randomizer)) return DynamicFrame.fromDF(df, self.glue_ctx, "sales_synthetic_data") DynamicFrame.salesdata_generator = salesdata_generator
ローカル環境で作成してそのままS3バケットにアップロードしてもいいのですが、AWS Glue StudioにはNotebook機能があります。こちらを使えばマネジメントコンソール上で開発やテストをシームレスに行えます。
S3バケットにファイルを置く
Glueでジョブを実行したことがあれば以下のようなS3バケットが自動的に生成されています。ここにtransforms
という名前でフォルダを作り、配下にJSONファイルとPythonファイルを配置します。
s3://aws-glue-assets-<AWSのaccount id>-<リージョン名>/transforms/
JSONファイル内でpath
を設定していない場合、Glueは自動的に同一の名前のPythonファイルをペアにします。
AWS Glue Job StudioからCustom Visual Transformsを使う
AWS Glue Studioでビジュアルジョブエディタを開き、Actionから検索すると、作成したTransformが選択できるようになりました。同じAWSアカウント内であれば他のジョブで使いまわすことも可能です。
パラメータとして指定した項目も反映されています。
Transformが表示されない場合はリロードしてみてください。リロードしても表示されない場合は、以下のポイントでJSONファイルの検証に失敗している可能性があります。
- 必須項目がすべてあるかどうか
- 有効なJSON形式になっているかどうか
- 不正確または無効なパラメータ
- 同じAmazon S3のパスに
.py
と.json
の両ファイルが存在しているかどうか .py
と.json
のファイル名が一致しているかどうか
最後に
一度変換処理を定義しておけば、標準で提供されている変換ノードと同じように選べるAWS Glue Custom Visual Transformを触ってみました。
標準で提供されている変換だと物足りず、かといって独自でSparkを記述するハードルも高い…という課題にピッタリはまる機能だと感じました。作成したTransformは同一AWSアカウント内であれば他のユーザーでも使えるので、ますますAWS Glueでのローコード開発が便利になりそうです。